from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel, EmailStr

app = FastAPI()


# 用户基本模型
class UserBase(BaseModel):
    username: str  # 用户名
    email: EmailStr  # 邮箱
    full_name: Optional[str] = None  # 全名


# 用户输入密码
class UserIn(UserBase):
    # 多了一个密码字段
    password: str


# 用户输出模型
class UserOut(UserBase):
    # 完整继承，不需要额外字段
    pass


# 用户入库模型
class UserInDB(UserBase):
    # 多了一个加密字段
    hashed_password: str


# 用户密码加密
def fake_password_hasher(raw_password: str):
    return "supersecret" + raw_password


# 保存用户
def fake_save_user(user_in: UserIn):
    hashed_password = fake_password_hasher(user_in.password)
    user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
    print("User saved! ..not really")
    return user_in_db


@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):
    user_saved = fake_save_user(user_in)
    return user_saved
